home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Education
/
World of Education.iso
/
world_s
/
startrek.zip
/
REALTIME.BAS
< prev
next >
Wrap
BASIC Source File
|
1985-05-23
|
24KB
|
454 lines
10 CLS : PRINT " REAL TIME STARTREK VERSION 85-05-23" : ON ERROR GOTO 6000
15 C3 = 1 : C4 = 15 : C7 = 56 :C6 = 10
20 PRINT : PRINT "By Joe Kasser" : PRINT : GOSUB 4500 : GOSUB 4660
30 PRINT : PRINT K9/100;"Klingons have invaded Federation territory" : PRINT
40 PRINT "Your mission is to destroy them in";T;"Stardates" : GOTO 3000
50 REM SUBROUTINE TO SET UP 2 RANDOM CO-ORDINATES
60 X=INT(RND(Z)*8) : Y=INT(RND(Z)*8) : RETURN
70 REM SUB TO PRINT HEADING
80 PRINT : PRINT D$(I);"AT QUADRANT";Q1+Z;",";Q2+Z : PRINT : RETURN
90 REM SUBROUTINE TO SET UP ENTERPRISE PARAMETERS
100 E=E0 : E1=0 : P=10 : RETURN
110 REM SUBROUTINE TO DAMAGE SOMETHING
120 Y=Z+RND(Z)*W : X=INT((C1-C2)*RND(Z)) : D(X)=Y+D(X) : PRINT D$(X); "DAMAGED" : RETURN
130 REM ENERGY HIT SUBROUTINE
140 E1=E1-H : E=E-H : IF E1=<0 THEN F9=2 : GOTO 160
150 IF H>E1/2 THEN PRINT "SHIELD OVERLOAD ....."; : GOSUB 110
160 RETURN
170 REM SUBROUTINE TO PRINT SCORE
180 N=INT(((K8-K9)/100)*(K5/2.5+K4+Z)^2*100/(T9-T)) : IF N<0 THEN N=0
190 PRINT "SCORE";TAB(38);N : RETURN
200 REM MAP (COMPUTER) ROUTINE
210 I=5 : LOCATE C4,C3 : IF D(I)>0 THEN PRINT "COMPUTER DOWN AT THIS TIME " : GOTO 280
220 FOR I=0 TO 7 : PRINT TAB(C3+(Z+I)*5);I+Z; : NEXT : PRINT : FOR I=0 TO 7 : LOCATE C4+I+1,C3 : PRINT I+Z ;
230 FOR J=0 TO 7 : PRINT " "; : IF I=Q1 AND J=Q2 AND Q(I,J)<0 THEN PRINT CHR$(8);"+***+"; : GOTO 270
240 IF Q(I,J)<0 THEN PRINT "*** "; : GOTO 270
250 E$=STR$(Q(I,J)) : E$=" 00"+MID$(E$,2) : : IF I=Q1 AND J=Q2 THEN PRINT CHR$(29);"+";RIGHT$(E$,3);"+"; : GOTO 270
260 PRINT RIGHT$(E$,3);" ";
270 NEXT J : PRINT : NEXT I
280 RETURN
300 REM LRS LONG RANGE SENSOR SCAN ROUTINE
310 LOCATE C2,C7 : IF D(I)>0 THEN PRINT D$(I); " DAMAGED" : GOTO 370
320 N=0 : FOR I=Q1-Z TO Q1+Z : LOCATE C2+N,C7 : N=N+Z : FOR J=Q2-Z TO Q2+Z: PRINT " ";
330 IF I<0 OR I>7 OR J<0 OR J>7 THEN PRINT "***" ; : GOTO 360
340 IF D(5)=0 THEN Q(I,J)=ABS(Q(I,J))
350 E$=STR$(Q(I,J)) : E$="00"+MID$(E$,2) : PRINT RIGHT$(E$,3);
360 NEXT J : PRINT : NEXT I
370 RETURN
390 REM
400 REM SRS SHORT RANGE SENSORS
410 IF D(I)>0 THEN PRINT D$(I); " DAMAGED" : RETURN
420 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN 440
430 IF D(5)=0 THEN Q(Q1,Q2)=ABS(Q(Q1,Q2))
440 GOSUB 3400 : LOCATE 3,1 : PRINT " 1 2 3 4 5 6 7 8";TAB(20); : GOSUB 170 : FOR I=0 TO 7 : LOCATE I+4,1 : PRINT I+Z ;
450 FOR J=0 TO 7 : PRINT MID$(S$,S(I,J),Z); " ";: NEXT J : PRINT TAB(20) ;
460 ON I+Z GOTO 470,480,490,500,510,520,530,540
470 PRINT "DAYS LEFT"; TAB(38);T : GOTO 550
480 PRINT "CONDITION "; TAB(38);C$ : GOTO 550
490 PRINT "SHIELDS"; TAB(38);E1 : GOTO 550
500 PRINT "ENERGY" ; TAB(38);E : GOTO 550
510 PRINT "PHOTON TORPEDOES";TAB(38);P : GOTO 550
520 PRINT "STARBASES";TAB(38);B9/10 : GOTO 550
530 PRINT "KLINGONS LEFT";TAB(38);K9/100 : GOTO 550
540 PRINT "KLINGONS CAPTURED";TAB(38);K4 : GOTO 550
550 NEXT I : RETURN
600 REM SHOOTBACK SUBROUTINE
610 IF C$="DOCKED" THEN 680
620 FOR I=0 TO 7 : IF K3(I)<=0 OR RND(Z)<.1*(I+Z) THEN 670
630 IF RND(Z)>K3(I)/500 THEN PRINT "KLINGON TORPEDO"; : H=RND(Z)*E1 : E1=E1+H : E=E+H : GOTO 660
640 H=K3(I)*.4*RND(Z) : K3(I)=K3(I)-H : H=H/(SQR((K1(I)-S1)^2+(K2(I)-S2)^2))^.4
650 PRINT H;"Unit hit on Enterprise";
660 PRINT " from sector";K1(I)+Z;",";K2(I)+Z : GOSUB 130 : IF F9>0 THEN 680
670 NEXT : IF E1<100 THEN PRINT D$(6);" Dangerously low";CHR$(7)
680 RETURN
700 REM MOVE KLINGON ROUTINE
710 FOR I=0 TO 7 : IF K3(I)<=0 THEN 740
720 GOSUB 50 : IF S(X,Y)<>Z THEN 740
730 S(K1(I),K2(I))=Z : K1(I)=X : K2(I)=Y : S(X,Y)=4
740 NEXT : RETURN
800 REM PHA PHASERS
810 IF K=0 THEN PRINT "No targets in quadrant ....... sir " : GOTO 950
820 IF D(I)>0 THEN PRINT D$(I);"OUT OF ACTION SIR" : GOTO 950
830 IF D(1)>0 THEN PRINT D$(1);"are not working, will use best guess settings"
840 INPUT "READY- how much energy do you want to fire "; X : IF X<=0 THEN 950
850 IF X>(E-E1) THEN PRINT "We don't have that much energy available sir" : GOTO 840
860 E = E - X : Y = K : FOR I = 0 TO 7 : IF K3(I)<=0 THEN 940
870 IF D(1)>0 THEN X = X*RND(Z)
880 H = X/(Y*(SQR((K1(I)-S1)^2+(K2(I)-S2)^2)^.4)) : K3(I) = K3(I) - H
890 PRINT "Hit on KLINGON at";K1(I)+Z;",";K2(I)+Z; : IF D(1)=0 THEN PRINT "(";K3(I);"Units left)" ELSE PRINT
900 IF K3(I)<=0 THEN K3(I) = 0 : PRINT "KLINGON DESTROYED" : S(K1(I),K2(I)) = Z : GOSUB 1220 : GOTO 940
910 IF K>Z OR K3(I)>E1/100 OR RND(Z)>.4 THEN 940
920 K3(I)=0 : S(K1(I),K2(I))=Z : GOSUB 1220 : IF RND(Z)<.7 THEN PRINT "KLINGON EXPLODED" : K5=K5+Z : GOTO 940
930 PRINT "KLINGON SURRENDERS .....Boarding party away" : K4 = K4 + Z : T1 = T : T = T - .5 : GOSUB 1800
940 NEXT
950 RETURN
1000 REM TOR PHOTON TORPEDOES
1010 IF D(I) > 0 THEN PRINT "TUBES BLOCKED" : GOTO 1210
1020 IF P = 0 THEN PRINT "NO TORPEDOE's LEFT SIR !" : GOTO 1210
1030 LOCATE 25,16 : INPUT "DIRECTION (1-9) ";C : IF C<1 OR C>9 THEN 1030
1040 Y1=S1+.5 : X1=S2+.5 : Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y)
1050 P=P-Z : FOR J1=0 TO E0 : Y1=Y1+Y : X1=X1+X : Y2=INT(Y1) : X2=INT(X1)
1060 IF X2<0 OR X2>7 OR Y2<0 OR Y2>7 THEN PRINT "MISSED" : GOTO 1210
1070 J2 = S(Y2,X2) : S(Y2,X2)=6 : GOSUB 400 : S(Y2,X2) = J2 : ON S(Y2,X2) GOTO 1200,1080,1190,1100,1150
1080 PRINT "STAR "; : IF RND(Z)<.5 THEN PRINT "ABSORBED TORPEDO" : GOTO 1210
1090 PRINT "DEFLECTED TORPEDO" : Y=Z+RND(Z)*8*.785398 : X=COS(Y) : Y=-SIN(Y) : GOTO 1200
1100 IF RND(Z)>.9 THEN 1200
1110 PRINT " KLINGON DESTROYED"
1120 FOR I=0 TO 7 : IF Y2=K1(I) AND X2=K2(I) THEN 1140
1130 NEXT I : PRINT "SENSOR MALFUNCTION";CHR$(7)
1140 K3(I)=0 : GOSUB 1220 : GOTO 1180
1150 PRINT " STARBASE DESTROYED, WELL DONE" : B=B-Z : B9=B9-10 : K8=K9 : T9=T+Z
1160 IF Q(Q1,Q2)<0 THEN Q(Q1,Q2)=Q(Q1,Q2)+10 ELSE Q(Q1,Q2)=Q(Q1,Q2)-10
1170 IF B9=0 THEN PRINT : PRINT "THAT WAS YOUR LAST STARBASE"
1180 S(Y2,X2)=Z : GOTO 1210
1190 PRINT CHR$(7);"EVASIVE ACTION ....missed us"
1200 NEXT J1
1210 RETURN
1220 REM SUBROUTINE TO CLEAR KLINGON FROM SIMULATION
1230 K=K-Z : K9=K9-100 : IF K9=0 THEN F9=5
1240 IF Q(Q1,Q2)<0 THEN Q(Q1,Q2)=Q(Q1,Q2)+100 ELSE Q(Q1,Q2)=Q(Q1,Q2)-100
1250 RETURN
1300 REM NAV/WARP ENGINES/NAVIGATION
1310 INPUT "DIRECTION PLEASE (1-9) ";C : IF C<1 OR C>9 THEN 1310
1320 INPUT "WARP FACTOR ";W : IF W=<0 THEN 1750
1330 IF W>8 THEN PRINT " SIR WE CANNA GO THAT FAST" : GOTO 1320
1340 IF D(0)=0 THEN 1360
1350 IF W>=Z THEN PRINT D$(I);"DAMAGED (maximum allowable=.9) " : GOTO 1320
1360 REM MOVE ON
1370 S(S1,S2)=Z : T1=T : IF K>0 AND W>=Z THEN GOSUB 600 : IF F9>0 THEN 1750
1380 Y1=S1+.5 : X1=S2+.5 : Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y)
1390 FOR I=0 TO INT(W*8) : T=T-.1 : Y1=Y1+Y : X1=X1+X : Y2=INT(Y1) : X2=INT(X1)
1400 IF X2<0 OR X2>7 OR Y2<0 OR Y2>7 THEN 1490
1410 ON S(Y2,X2) GOTO 1470,1420,1470,1440,1450
1420 PRINT "STAR DEAD AHEAD" : IF RND(Z)>.6 AND B=0 THEN 1640
1430 PRINT "EMERGENCY ENGINE SHUT DOWN" : D(0)=D(0)+.5 : GOSUB 1780 : GOTO 1720
1440 PRINT : PRINT "STAND BY FOR COLLISION WITH KLINGON" : GOSUB 1780 : GOSUB 110 : GOTO 1720
1450 GOSUB 1780 : PRINT : PRINT "MESSAGE FROM STARBASE" : IF K>0 THEN PRINT "CLUMSY" : GOTO 1720
1460 PRINT "ENTERPRISE CAUGHT IN TRACTOR BEAM BEFORE COLLISION" : GOTO 1720
1470 NEXT : S1=Y2 : S2=X2 : S(Y2,X2)=3 : GOTO 1580
1490 REM-OUT OF SECTOR
1500 Q1=INT(Q1+W*Y+(S1+.5)/8) : Q2=INT(Q2+W*X+(S2+.5)/8) : T=T-.6
1510 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN 1550
1520 REM INSIDE GALAXY
1530 IF G9=Z THEN GOSUB 1760 : G9=0
1540 GOTO 1570
1550 IF G9=0 THEN GOSUB 1760 : G9=Z
1570 GOSUB 3200
1580 I=INT(RND(Z)*100) : IF I=0 OR I>4 THEN 1720
1590 IF G9=Z THEN 1680
1600 PRINT : IF B>0 THEN 1720
1610 ON I GOTO 1620,1640,1670,1680
1620 PRINT CHR$(7);"KLINGON SPACE MINE " : H=RND(Z)*400 : GOSUB 130 : IF F9>0 THEN 1750
1630 PRINT "SHIELDS DOWN TO"; E1; " UNITS" : GOTO 1720
1640 PRINT "SPACE WARP DUE TO GRAVITATIONAL ANOMALY" : GOSUB 50 : Q1=INT(X-P) : Q2=INT(Y-P)
1650 G9=0 : IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN G9=Z
1660 PRINT "SENSORS SHOW WE SEEM TO HAVE MOVED TO QUADRANT"; Q1+Z;",";Q2+Z : GOSUB 3200 : GOTO 1740
1670 PRINT CHR$(7);"ION STORM " : GOSUB 110 : GOTO 1720
1680 REM SPOCK DOES HIS FIXING HERE
1690 GOSUB 50 : FOR I=X TO C1-C2 : IF D(I)>0 THEN 1710
1700 NEXT : FOR I=0 TO X : IF D(I)<=0 THEN NEXT : GOTO 1720
1710 D(I)=0 : PRINT " Mr. SPOCK FIXED the ";D$(I)
1720 E=E-((INT(W*8))^2)/2 : IF E<0 THEN F9=3 : GOTO 1750
1730 GOSUB 1800 : IF E1>E THEN E1=E
1740 GOSUB 3400
1750 RETURN
1760 PRINT "CROSSING BARRIER at GALACTIC BOUNDARY" : GOSUB 110 : RETURN
1780 REM SUBROUTINE TO BACK UP ONE SECTOR
1790 S1=INT(Y1-Y) : S2=INT(X1-X) : S(S1,S2)=3 : RETURN
1800 REM SUBROUTINE FOR REPAIRS AFTER TIME (T1-T)
1810 IF T<0 THEN F9=4 : GOTO 1870
1820 N=0 :FOR I=0 TO C1-C2 : IF D(I)=<0 THEN 1860
1830 D(I)=D(I)-(T1-T) : IF D(I)>0 THEN 1860
1840 IF N=0 THEN PRINT : PRINT "DAMAGE CONTROL REPORTING " : N=Z
1850 D(I)=0 : PRINT D$(I);"REPAIRED"
1860 NEXT
1870 RETURN
1900 REM COMPUTER
1910 IF D(I)>0 THEN PRINT "COMPUTER DOWN AT THIS TIME " : GOTO 1970
1920 INPUT "Computer WORKING ";A$
1930 IF LEN(A$)<3 THEN PRINT "THAT DOES NOT COMPUTE (3 letters please) " : PRINT : GOTO 1920
1940 FOR I=0 TO LEN(C2$)/3-Z : IF A$=MID$(C2$,I*3+Z,3) THEN 1960
1950 NEXT : FOR I=0 TO LEN(C2$)/3-Z : PRINT MID$(C2$,I*3+Z,3); TAB(8); C3$(I) : NEXT : PRINT : GOTO 1920
1960 ON I+Z GOSUB 200,170,1980,2060,2360
1970 RETURN
1980 REM COMPUTER KLINGON STATUS
1990 IF D(5)>0 OR D(1)>0 THEN PRINT "COMPUTER/SENSOR MALFUNCTIONING AT THIS TIME " : GOTO 2050
2000 IF K=0 THEN PRINT "No KLINGONs in Quadrant" : GOTO 2050
2010 J=0 : X1=S1 : Y1=S2 :: FOR I=0 TO 7 : IF K3(I)=<0 THEN 2040
2020 IF J=0 THEN PRINT "KLINGON"," ENERGY";TAB(30);"DISTANCE";TAB(40);"DIRECTION" : J=Z
2030 PRINT K1(I)+Z;",";K2(I)+Z,K3(I); : X=K1(I) : Y=K2(I) : GOSUB 2210 : PRINT TAB(30);X2;TAB(40);Y2
2040 NEXT
2050 C9=Z : GOTO 1970
2060 REM DIRECTION/DISTANCE CALCULATOR
2070 INPUT "Quadrant, Sector or Other (Q/S/O) ";A$
2080 IF LEFT$(A$,Z)="Q" THEN 2120
2090 IF LEFT$(A$,Z)="S" THEN 2140
2100 IF LEFT$(A$,Z)="O" THEN 2160
2110 GOTO 2070
2120 X1=Q1 : Y1=Q2 : PRINT "YOU ARE IN QUADRANT";Q1+Z;",";Q2+Z
2130 INPUT "DESTINATION CO-ORDINATES (Row,Column) ";X,Y : X=X-Z : Y=Y-Z : GOTO 2190
2140 X1=S1 : Y1=S2 : PRINT "YOU ARE IN SECTOR"; S1+Z;",";S2+Z
2150 INPUT "DESTINATION/TARGET CO-ORDINATES (Row,Column) ";X,Y : X=X-Z : Y=Y-Z : GOTO 2190
2160 PRINT "YOU ARE IN QUADRANT";Q1+Z;",";Q2+Z,"SECTOR ";S1+Z;","S2+Z
2170 PRINT : INPUT "INITIAL CO-ORDINATES (Row,Column) ";X1,Y1
2180 INPUT "DESTINATION CO-ORDINATES (Row,Column) ";X,Y
2190 PRINT : GOSUB 2210 : PRINT "DISTANCE=";X2, "BEARING=",Y2
2200 RETURN
2210 REM DIRECTION/DISTANCE SUBROUTINE
2220 IF X=X1 AND Y=Y1 THEN X2=0 : Y2=10 : GOTO 2350
2230 X2=SQR((X1-X)^2+(Y1-Y)^2)
2240 X=X-X1 : Y=Y-Y1 : IF X=<0 THEN 2260
2250 IF Y<0 THEN 2280 ELSE 2320
2260 IF Y=<0 THEN 2310
2270 Y2=Z : IF X=0 THEN 2350 ELSE 2290
2280 Y2=5 : IF X=0 THEN 2350
2290 IF ABS(X)>ABS(Y) THEN Y2=Y2+Z+(Z-(ABS(Y)/ABS(X))) : GOTO 2350
2300 Y2=Y2+(ABS(X)/ABS(Y)) : GOTO 2350
2310 Y2=3 : IF Y=0 THEN 2350 ELSE 2330
2320 Y2=7 : IF Y=0 THEN 2350
2330 IF ABS(X)<ABS(Y) THEN Y2=Y2+Z+(Z-(ABS(X)/ABS(Y))) : GOTO 2350
2340 Y2=Y2+(ABS(Y)/ABS(X))
2350 RETURN
2360 IF D(1)>0 THEN PRINT D$(1);"are not working" : GOTO 2470
2370 IF S9=Z THEN 2410 : REM SECTOR/SYSTEM SCAN
2380 FOR I=0 TO 7 : FOR J=0 TO 7 : S8(I,J)=0 : IF S(I,J)<>2 OR RND(Z)>.05 THEN 2400
2390 IF RND(Z)<.5 THEN S8(I,J)=99 ELSE S8(I,J)=INT(RND(Z)*8)
2400 NEXT J : NEXT I : S9=Z
2410 PRINT : PRINT "SECTOR","SENSOR READING" : PRINT : FOR I=0 TO 7 : FOR J=0 TO 7
2420 IF S(I,J)<>2 THEN 2460
2430 PRINT I+Z;",";J+Z, : IF S8(I,J)=0 THEN PRINT "No significant data" : GOTO 2460
2440 IF S8(I,J)=99 THEN PRINT "Dilithium Crystal deposits" : GOTO 2460
2450 PRINT "Class M Planet, Culture level"; S8(I,J)
2460 NEXT J : NEXT I : PRINT
2470 RETURN
2500 REM VIS VISUAL
2510 LOCATE C6,C7 : N=0 : FOR I=S1-2 TO S1+2 : LOCATE C6+N,C7 : N=N+Z : FOR J=S2-2 TO S2+2
2520 IF I<0 OR I>7 OR J<0 OR J>7 THEN PRINT "$"; : GOTO 2540
2530 PRINT MID$(S$,S(I,J),Z);
2540 PRINT " "; : NEXT : PRINT : NEXT : C9=Z : RETURN
2600 REM RES RESIGN
2610 IF K>0 THEN PRINT : PRINT "YOUR SURRENDER WILL NOT BE ACCEPTED " : GOTO 2650
2620 INPUT "ARE YOU SURE (Yes/No) ";A$ : IF LEN(A$)=0 THEN 2620
2630 IF LEFT$(A$,Z)="N" THEN 2650
2640 IF LEFT$(A$,Z)="Y" THEN F9=Z
2650 RETURN
2700 REM SHE SHIELDS
2710 IF C$="DOCKED" THEN PRINT "Regulations forbid raising the shields when docked" : GOTO 2770
2720 IF D(I)>0 THEN PRINT D$(I)+"DAMAGED" : GOTO 2770
2730 PRINT D$(I);"currently at";E1;"Units"
2740 INPUT "How much energy to divert to the shields Sir ";N
2750 IF N>E THEN PRINT "WE DON'T HAVE THAT MUCH SIR" : GOTO 2740
2760 E1=N
2770 RETURN
2800 REM DAM DAMAGE CONTROL
2810 GOSUB 70 : D8=0
2820 FOR I=0 TO C1-C2 : IF D(I)>0 THEN D8=D8+Z
2830 NEXT: PRINT : IF D8=0 THEN PRINT : PRINT "ALL SYSTEMS A-OK !": GOTO 2910
2840 PRINT "SYSTEM";TAB(28);"ETR" : PRINT
2850 FOR I=0 TO C1-C2 : IF D(I)>0 THEN PRINT D$(I);TAB(28);INT(D(I)+Z)
2860 NEXT : IF K>0 THEN 2910
2870 PRINT :INPUT "HOW MANY DAYS TO SPEND ON REPAIRS SIR ";D8 : IF D8<0 THEN D8=0
2880 FOR I=0 TO C1-C2 : IF D(I)=0 THEN 2900
2890 D(I)=D(I)-D8 : IF D(I)=<0 THEN D(I)=0 : PRINT D$(I); "REPAIRED"
2900 NEXT : T=T-D8
2910 RETURN
3000 REM-MAIN LOOP
3010 CLS
3020 IF C9=0 THEN I=Z : IF D(Z)=0 THEN GOSUB 400 ELSE I=11 : GOSUB 2500
3025 IF D(Z)=0 THEN GOSUB 400 ELSE I=11 : GOSUB 2500
3030 GOSUB 300 : GOSUB 200 : GOSUB 2500
3040 LOCATE 24,1
3050 INPUT "COMMAND ";A$ : IF LEN(A$)<3 THEN PRINT "BEG PARDON CAPTAIN (3 letters please) " : GOTO 3050
3060 FOR I=0 TO LEN(C1$)/3-Z : IF A$=MID$(C1$,(I*3)+Z,3) THEN 3080
3070 NEXT : FOR I=0 TO C1 : PRINT MID$(C1$,(I*3)+Z,3); TAB(8);D$(I) : NEXT : C9=99 : GOTO 3000
3080 C9=I : ON I+Z GOSUB 1300,400,300,800,1000,1900,2700,4300,3600,3800,2800,2500,2600,5000,5500,200,1980,2360
3090 IF F9>0 THEN 9000 ELSE PRINT : IF C9=Z THEN 3110
3100 IF K>0 THEN GOSUB 700 : GOSUB 600
3110 IF F9>0 THEN 9000
3140 GOTO 3000
3200 REM SUBROUTINE TO SET UP QUADRANT
3210 FOR I=0 TO 7 : FOR J=0 TO 7 : S(I,J)=Z : NEXT J : NEXT I : S9=0
3220 IF Q1<0 OR Q1>7 OR Q2<0 OR Q2>7 THEN K=0 : B=0 : S=INT(RND(Z)*1.2) : GOTO 3250
3230 N=ABS(Q(Q1,Q2)) : K=INT(N/100) : N=N-K*100 : B=INT(N/10)
3240 S=ABS(Q(Q1,Q2))-(K*100+B*10)
3250 GOSUB 50 : S1=X : S2=Y : S(X,Y)=3 : IF B=0 THEN 3270
3260 GOSUB 50 : IF S(X,Y)<>Z THEN 3260 ELSE S(X,Y)=5
3270 FOR I=1 TO S : GOSUB 50 : IF S(X,Y)<>Z THEN 3290 ELSE S(X,Y)=2
3290 NEXT : FOR I=0 TO 7 : K3(I)=0 : NEXT : IF K=0 THEN 3340
3300 FOR I=1 TO K
3310 GOSUB 50 : IF S(X,Y)<>Z THEN 3310 ELSE S(X,Y)=4
3320 K1(I)=X : K2(I)=Y : K3(I)=RND(Z)*1000 : NEXT : PRINT : FOR I=Z TO 3 : PRINT "RED ALERT "; : NEXT
3330 PRINT CHR$(7) : IF E1=0 THEN PRINT "YOU FORGOT TO RAISE YOUR SHIELDS"
3340 RETURN
3400 REM SUBROUTINE TO SET UP CONDITION
3410 FOR I=S1-Z TO S1+Z : FOR J=S2-Z TO S2+Z
3420 IF I<0 OR I>7 OR J<0 OR J>7 THEN 3440
3430 IF S(I,J)=5 THEN 3450
3440 NEXT J : NEXT I : GOTO 3490
3450 IF C$="DOCKED" THEN GOSUB 90 : GOSUB 3550 : GOTO 3540
3460 IF K>0 AND RND(Z)<.5 THEN 3490
3470 PRINT : PRINT D$(6);"LOWERED FOR DOCKING" : GOSUB 3550 : PRINT : PRINT "REPAIRS and REFUELLING completed"
3480 GOSUB 90 : T=T-.5 : C$="DOCKED": GOTO 3540
3490 IF K>0 THEN C$="RED" : GOTO 3540
3500 FOR I=0 TO C1-C2 : IF D(I)>0 THEN C$="YELLOW" : GOTO 3540
3510 NEXT : IF E=<E0/10 THEN C$="YELLOW" ELSE C$="GREEN"
3540 RETURN
3550 REM SUBROUTINE TO REPAIR ALL SUB-SYSTEMS
3560 FOR I=0 TO C1-C2 : D(I)=0 : NEXT : RETURN
3600 REM TRANSPORTER
3610 IF D(I)>0 THEN PRINT D$(I);"INOPERATIVE AT THIS TIME" : GOTO 3730
3620 IF D(1)>0 THEN PRINT D$(1);"INOPERATIVE, CANNOT LOCK IN ANY CO-ORDINATES" : GOTO 3730
3630 IF S9=0 THEN PRINT "Quadrant is not scanned" : GOTO 3730
3640 IF E1>0 THEN PRINT "SHIELDS are up. Transporter will not beam through" : GOTO 3730
3650 IF K>0 THEN PRINT "KLINGONS will block the Transporter" : GOTO 3730
3660 INPUT "Destination co-ordinates ";X,Y : IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 3660
3670 X=X-Z : Y=Y-Z : IF S8(X,Y)=0 THEN PRINT "THERE IS NOTHING AT THOSE CO-ORDINATES" : GOTO 3730
3680 H=SQR((S1-X)^2+(S2-Y)^2)*10 : IF (E-H)<0 THEN PRINT "We don't have the energy to beam them that far" : GOTO 3730
3690 E=E-H : IF E<E1 THEN E1=E
3700 IF S8(X,Y)=99 THEN GOSUB 4000 ELSE GOSUB 4100
3710 E=E-H : IF E<E1 THEN E1=E
3720 PRINT : PRINT "Landing Party beamed aboard"
3730 RETURN
3800 REM SHUTTLECRAFT
3810 IF D(I)>0 THEN PRINT D$(I);"INOPERATIVE AT THIS TIME" : GOTO 3920
3820 IF D(1)>0 THEN PRINT D$(1); "INOPERATIVE, CANNOT LOCATE ANY CO-ORDINATES" : GOTO 3920
3830 IF S9=0 THEN PRINT "Quadrant is not scanned" : GOTO 3920
3840 IF E1>0 THEN PRINT "SHIELDS are up. Shuttlecraft will not pass through" : GOTO 3920
3850 IF K>0 THEN PRINT "KLINGONS will destroy the Shuttlecraft" : GOTO 3920
3860 INPUT "Destination co-ordinates ";X,Y : IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 3860
3870 X=X-Z : Y=Y-Z : IF S8(X,Y)=0 THEN PRINT "THERE IS NOTHING AT THOSE CO-ORDINATES" : GOTO 3920
3880 X1=(SQR((S1-X)^2+(S2-Y)^2))/10 : IF (T-X1*2)<0 THEN PRINT "We don't have that much time left": GOTO 3920
3890 T1=T : T=T-X1 : GOSUB 1800 : PRINT "Shuttlecraft Gallileo launched" : PRINT
3900 IF S8(X,Y)=99 THEN GOSUB 4000 ELSE GOSUB 4100
3910 T1=T : T=T-X1 : GOSUB 1800 : PRINT "Shuttlecraft Gallileo returned"
3920 RETURN
4000 REM MINING OPERATION
4010 PRINT : J=RND(Z)*E0 : PRINT "LANDING PARTY reports that cystals can be mined"
4020 PRINT "to supply us with";J;"Units per day down here"
4030 PRINT : INPUT "How many days do they stay down ";N : IF N<0 THEN N=0
4040 IF (T-N)<0 THEN PRINT "YOU DON'T HAVE THAT MUCH TIME" : GOTO 4060
4050 T1=T : T=T-N : E=E+N*J : GOSUB 1800
4060 RETURN
4100 REM SPARES/ETC
4110 J=RND(Z)*S8(X,Y) : PRINT "LANDING PARTY reports that they can locate"
4120 PRINT "materials to expedite repairs in";J;"Stardates"
4130 INPUT "How long should they stay there ";X : IF X>J THEN X=J
4140 IF (T-X)<0 THEN PRINT "YOU DON'T HAVE THAT MUCH TIME" : GOTO 4210
4150 IF J=X THEN J=E0
4160 J=X/J : T=T-X : N=0 : FOR I=0 TO C1-C2 : IF D(I)=<0 THEN 4200
4170 D(I)=D(I)*J : D(I)=D(I)-(T1-T) : IF D(I)>0 THEN 4200
4180 IF N=0 THEN PRINT : PRINT "DAMAGE CONTROL REPORTING " : N=Z
4190 D(I)=0 : PRINT D$(I);"REPAIRED"
4200 NEXT
4210 RETURN
4300 REM LONG RANGE PROBE
4310 IF D(I)>0 THEN PRINT "LAUNCH CONTROL INOPERATIVE AT THIS TIME" : GOTO 4470
4320 L3=L3+Z : IF L3>7 THEN PRINT " No Probes left... Sir " : GOTO 4470
4330 IF K>0 THEN PRINT "You are not allowed to launch a probe during a battle" : GOTO 4470
4340 PRINT "LRP";L3;"Direction (1-9) "; : INPUT C : IF C=0 THEN 4470
4350 IF C<Z OR C>9 THEN 4340
4360 X1=Q1 : Y1=Q2 : X2=Q1+.5 : Y2=Q2+.5 : T1=T : FOR I=0 TO E0 : T=T-.1
4370 Y=(C-Z)*.785398 : X=COS(Y) : Y=-SIN(Y)
4380 X2=X2+Y : Y2=Y2+X : X1=INT(X2) : Y1=INT(Y2)
4390 IF SQR((X1-Q1)^2+(Y1-Q2)^2)>5 THEN PRINT "Probe out of range" : GOTO 4460
4400 PRINT X1+Z;",";Y1+Z;" =";
4410 IF X1<0 OR X1>7 OR Y1<0 OR Y1>7 THEN PRINT "***" : GOTO 4450
4420 E$=STR$(Q(X1,Y1)) : E$="00"+MID$(E$,2) : PRINT RIGHT$(E$,3)
4430 IF D(5)=0 THEN Q(X1,Y1)=ABS(Q(X1,Y1))
4440 IF RND(Z)<ABS(Q(X1,Y1)+Z)/1000 THEN PRINT "Contact lost with probe" : GOTO 4460
4450 NEXT
4460 GOSUB 1800
4470 RETURN
4500 REM INITIALISATION SEQUENCE
4510 Z=1 : S$=".*EKB+" : E0=4000 : C1=14 : C2=5
4520 DIM D(C1),D$(C1),Q(7,7),S(7,7),K1(7),K2(7),K3(7),S8(7,7)
4530 PRINT "Welcome to the Starfleet Academy Command Training"
4540 PRINT "Simulator. You are assigned the role of the captain"
4550 PRINT "of the Starship Enterprise."
4560 PRINT : PRINT "For assistance, type HELP or read the manual"
4570 D$(0)="WARP ENGINES " : D$(1)="SHORT RANGE SENSORS " : D$(2)="LONG RANGE SENSORS " : D$(3)="PHASERS "
4580 D$(4)="PHOTON TORPEDOES " : D$(5)="COMPUTER " : D$(6)="SHIELDS " : D$(7)="LONG RANGE PROBES "
4590 D$(8)="TRANSPORTER " :D$(9)="SHUTTLECRAFT " :D$(10)="DAMAGE CONTROL " :D$(11)="VISUAL " :D$(12)="RESIGN"
4600 D$(13)="SAVE THE STATE OF THE GAME" : D$(14)="LOAD A SAVED GAME"
4610 C1$="NAVSRSLRSPHATORCOMSHELRPTRASHUDAMVISRESSAVLSGMAPKSTSCA" : C2$="MAPSTAKSTDIRSCA"
4620 C3$(0)="MAP" : C3$(1)="STAtus (Score)" : C3$(2)="KLINGON STatus"
4630 C3$(3)="DIRECTION/DISTANCE calculator" : C3$(4)="Sector/System SCAn"
4650 RETURN
4660 C9=0 : K4=0 : K5=0 : F9=0 : G9=0 : K9=0 : B9=0 : L3=0 : GOSUB 3550
4670 FOR I=0 TO 7 : FOR J=0 TO 7 : GOSUB 4790 : Q(I,J)=-(K+B+S) : NEXT J : NEXT I
4710 IF K9>2000 THEN 4740
4720 GOSUB 50 : IF Q(X,Y)<-9 THEN 4720
4730 GOSUB 4790 : Q(X,Y)=-(K+B+S) : GOTO 4710
4740 IF K9/100<30 THEN T=30 ELSE T=K9/100
4750 T9=T+Z : IF B9=0 THEN GOSUB 50 : Q(X,Y)=Q(X,Y)-10 : B9=10
4760 GOSUB 50 : Q1=X : Q2=Y : GOSUB 3200 : GOSUB 90 : E1=E0/10 : GOSUB 3400 : RETURN
4790 S=INT(RND(Z)*7+Z)
4800 B=0 : IF RND(Z)<.02 THEN B=10 : B9=B9+B
4810 K=0 : IF RND(Z)>.06 THEN 4830
4820 K=INT(RND(Z)*8)*100 : K9=K9+K : K8=K9
4830 RETURN
5000 REM SAVE GAME
5010 PRINT : INPUT "What filename do you want to save the game in ";A$ : IF LEN(A$)=0 THEN 5010
5020 IF LEN(A$)>8 THEN A$=LEFT$(A$,8)
5030 A$=A$ +".TRK"
5040 OPEN "O",#1,A$
5050 WRITE#1,"G3ZCZ"
5100 FOR I=0 TO 7 : FOR J=0 TO 7 : WRITE#1, S(I,J),S8(I,J),Q(I,J) : NEXT J : NEXT I
5130 WRITE#1,E,E1,B,B9,K,K4,K5,K8,K9,Q1,Q2,S,S1,S2,T,T9,X,Y,W,H,N,C$,P,F9,C,G9,S9,C9,D8,L3,X1,X2,Y1,Y2
5160 FOR I=0 TO 7 : WRITE#1, K1(I),K2(I),K3(I) : NEXT
5180 FOR I=0 TO C1-C2 : WRITE#1, D(I) : NEXT
5200 CLOSE#1 : RETURN
5500 REM RESTORE A SAVED GAME
5510 PRINT : INPUT "What is the name of the file you saved the game on ";A$ : IF LEN(A$)=0 THEN 5510
5520 IF LEN(A$)>8 THEN A$=LEFT$(A$,8)
5530 A$=A$ +".TRK"
5540 OPEN "I",#1,A$
5560 INPUT#1, E$ : IF E$<>"G3ZCZ" THEN PRINT "WRONG DATA FILE " GOTO 5700
5600 FOR I=0 TO 7 : FOR J=0 TO 7 : INPUT#1, S(I,J),S8(I,J),Q(I,J) : NEXT J : NEXT I
5630 INPUT#1,E,E1,B,B9,K,K4,K5,K8,K9,Q1,Q2,S,S1,S2,T,T9,X,Y,W,H,N,C$,P,F9,C,G9,S9,C9,D8,L3,X1,X2,Y1,Y2
5660 FOR I=0 TO 7 : INPUT#1, K1(I),K2(I),K3(I) : NEXT
5680 FOR I=0 TO C1-C2 : INPUT#1, D(I) : NEXT
5700 CLOSE#1 : RETURN
6000 REM ERROR TRAPPING ROUTINES
6010 ON ERROR GOTO 6000
6020 IF ERR=58 THEN 6150
6030 IF ERR=61 THEN 6200
6040 IF ERR=62 THEN 6250
6050 IF ERR=67 THEN 6300
6060 IF ERR=53 THEN 6100
6070 PRINT "ERROR ";ERR;" AT LINE ";ERL
6090 GOTO 9230
6100 PRINT A$; " IS NOT ON THE DISK" : RESUME 5500
6150 PRINT "THAT FILE ALREADY EXISTS"
6160 INPUT "Do you wish to overwrite it (Y or N) ";E$ : IF LEN(E$)=0 THEN 6160
6170 IF LEFT$(E$,1)="Y" THEN RESUME 5040
6180 IF LEFT$(E$,1)="N" THEN RESUME 5000 ELSE 6160
6200 PRINT "DISK IS FULL"
6210 PRINT "I CAN'T SAVE ANYTHING ON THAT DISK" : RESUME 5000
6250 PRINT A$;" DOES NOT CONTAIN THE CORRECT FORM OF DATA" : CLOSE#1 : RESUME 5500
6300 PRINT "THERE ARE TOO MANY FILES ON THE DISK" : GOTO 6210
9000 REM ENDGAME
9010 PRINT : ON F9 GOTO 9020,9040,9080,9130,9160
9020 REM F9=1 RESIGNATION ENDING
9030 GOTO 9180
9040 REM F9=2 CREAMED BY KLINGON
9050 PRINT "THE ENTERPRISE HAS BEEN DESTROYED "
9060 PRINT "You did not make such a good Captain, did you ? "
9070 GOTO 9180
9080 REM F9=3 RAN OUT OF ENERGY
9090 PRINT "The Enterprise has run out of energy." : PRINT
9100 PRINT "You have just condemed yourself and your crew to"
9110 PRINT "a horrible and un-necessary death."
9120 GOTO 9180
9130 REM F9=4 RAN OUT OF TIME
9140 PRINT "You did not complete your mission in time"
9150 GOTO 9180
9160 REM F9=5 PLAYER WON
9170 PRINT "CONGRATULATIONS you passed your test"
9180 PRINT : GOSUB 170 : INPUT "Do you want to play again (Yes/No) "; A$ : IF LEN(A$)=0 THEN 9180
9190 IF LEFT$(A$,Z)="N" THEN 9230
9200 IF LEFT$(A$,Z)<>"Y" THEN 9180
9210 REM START NEW GAME
9220 PRINT CHR$(26): PRINT : PRINT "WAIT FOR IT" : GOSUB 4660 : GOTO 30
9230 END